package com.lee.injection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Description
 * spring 在构造bean时, 默认使用的构造策略是: {@link org.springframework.beans.factory.support.AbstractBeanDefinition.AUTOWIRE_NO}
 * 在没有Autowired注解加在任何一个构造方法上时,
 *      AUTOWIRE_NO 会选择默认的构造方法.
 *      AUTOWIRE_BY_TYPE 也会选择默认构造方法.
 *      AUTOWIRE_CONSTRUCTOR 会选择参数在spring容器中最多的构造方法.
 * 如果有Autowired 注解在某个构造方法上.
 *      无论任何注入模式, 都会使用带注解的构造方法.
 * AUTOWIRE_BY_NAME
 *      这种模式下不会修改bean的构造器选择, 还是会优先选择默认构造器.
 *      功能在于, 当我们的类中包含set方法时, 会验证set方法的参数类型是否是spring容器中存在的Bean类型, 如果是, 且set名称符合标准属性
 *      setA(A a) 这种标准名称, 就会调用这种set方法. 名称不对, 或者参数类型在spring容器中不存在, 都不会去执行.
 * @Author winston
 * @DateTime 2022/2/22
 */
@Component
public class TestClass {

    public TestClass() {
        System.out.println("default construct");
    }

//    @Autowired
    public TestClass(A a) {
        System.out.println("construct with a");
    }

    public TestClass(A a, B b) {
        System.out.println("construct with a, b");
    }


//    @Autowired
    public void setC(C c) {
        System.out.println("set c");
    }

    public void setB(B bb) {
        System.out.println("set bb");
    }

    public void setA(A aa) {
        System.out.println("set a without parameter");
    }
}
